﻿using Domain.Entidades;
using Domain.Interfaces.Repositorios;
using Domain.Interfaces.Servicos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;

namespace Domain.Servicos
{
    public class DocumentosService : ServiceBase<documento>, IDocumentosService
    {
        private readonly IDocumentosRepository _documentosRepository;
        private readonly IUsuarioService _usuarioservice;

        public DocumentosService(IDocumentosRepository documentosRepository, IUsuarioService usuarioservice) : base(documentosRepository)
        {
            _documentosRepository = documentosRepository;
            _usuarioservice = usuarioservice;
        }
   
      

        public void enviar_email(documento doc, VW_usuarios user, string assunto, int tipo,IEnumerable<VW_documentos_email> emails)
        {
            try


            {


                IEnumerable<VW_documentos_email> user_email;
                if (emails != null)
                {
                    user_email = emails;
                }
                else
                { 
                    user_email = _documentosRepository.documentos_email(doc.doc_codigo);
                }

                
                
                System.Net.Mail.MailMessage objNovoEmail = new System.Net.Mail.MailMessage();
                SmtpClient objSmtp = new SmtpClient();

                bool verifica;
                string cabecalho="";


                switch (tipo)
                {
                    case 1:
                        cabecalho = "DOCUMENTO INSERIDO NA INTRANET";
                        break;
                    case 2:
                        cabecalho = "DOCUMENTO ALTERADO NA INTRANET";
                        break;
                  
                }


                foreach (VW_documentos_email usu in user_email)
                {
                    verifica = false;

                    foreach (MailAddress email in objNovoEmail.To)
                    {


                        if (email.Address.Replace("@credivale.org.br","") == usu.usu_email)
                        {
                            verifica = true;

                        }
                    }


                    if (verifica == false)
                    {

                        if (usu.usu_email.IndexOf('@') < 0)
                        {
                            objNovoEmail.To.Add(new MailAddress(usu.usu_email + "@credivale.org.br"));
                        }
                        else
                        {
                            objNovoEmail.To.Add(new MailAddress(usu.usu_email));
                        }
                    }

                }

     
                if (user.usu_email.IndexOf('@') < 0)
                {
                    objNovoEmail.From = new MailAddress(user.usu_email + "@credivale.org.br");
                }
                else
                {
                    objNovoEmail.From = new MailAddress(user.usu_email);
                }

                //Adiciona a prioridade do e-mail
                objNovoEmail.Priority = System.Net.Mail.MailPriority.High;

                //                // 'Adicionando o assunto ao atributo assunto
                objNovoEmail.Subject = assunto;

                //                // 'Formato de e-mail em Html?
                objNovoEmail.IsBodyHtml = true;
                string cCorpoEmail = "";


                cCorpoEmail = "<html><head><meta charset='utf-8' /></head><body>" +
    "<table style='border-color:#003b42; font-family:Arial;' cellspacing='0' cellpadding='30' width='800px' border='4' align='center'><tr><td>" +
        "<div style='overflow: hidden; margin-left:auto; margin-right:auto; margin-top:15px; padding-top:10px; padding-top:10px; border-bottom: 5px solid #CCC; width:800px; float:none; text-align:center;'>" +
                    " <font style='font-size:20px;  font-weight:bold; '>" + cabecalho + "</font><br /><br />" +
                    "<font style='font-size:15px; font-weight:bold; float:left;'>Por: </font>" + user.usu_nome + " - " + user.usu_login + "(" + user.set_descricao + ")<br /> " +
                    "<font style='font-size:15px; font-weight:bold; float:left;'>Em: </font>" + String.Format("{0:dd/MM/yyyy HH:mm}", DateTime.Now) + "<br/><br/> " +
        "<font style='font-size:20px;  font-weight:bold; '> Observações importantes</font><br />" +
      "<div style='margin-left:auto; margin-right:auto; margin-top:15px; margin-bottom:15px; float:none; text-align:left;'>" +
                 doc.doc_observacao +
                "</div></div>" +
                "<div style='overflow: hidden; padding: 17px; margin-left:auto; margin-right:auto;margin-top:10px; width:800px;float:none; text-align:LEFT;'>" +
                    "<font style='font-size:15px; font-weight:bold'>Documento: </font>" + doc.doc_desc + doc.doc_extensao + "<br />" +
                    "<font style='font-size:15px; font-weight:bold'>Origem: </font>" + doc.tipos_documentos.origem_documentos.ori_descricao + "<br />" +
                    "<font style='font-size:15px; font-weight:bold'>Tipo: </font>" + doc.tipos_documentos.tip_descricao + "<br />" +
                    "<a target='_blank' href='http://www.credivale.org.br/Intranet_/Documentos/Arquivos?arq=" + doc.doc_codigo.ToString() + "'><span>Clique aqui para visualizar ou baixar o arquivo</span> </a><br /> </div>" +
                   "<div style='overflow: hidden; margin-left:auto; margin-right:auto; margin-top:15px; padding-top:10px; border-top: 5px solid #CCC; width:800px; float:none; text-align:center;'>" +
                    "<font style='font-size:40px;  font-weight:bold; color:#00494e'>SICOOB</font><font style='font-size:40px;  font-weight:bold; color:#00b0a0'>CREDIVALE</font>" +
                "</div>" +
                "</td></tr></table></body></html>";



//                cCorpoEmail = "<html><head><meta charset='utf-8' /></head><body>" +
//"<table style='border-color:#003b42; font-family:Arial;' cellspacing='0' cellpadding='30' width='800px' border='4' align='center'><tr><td>" +
//         "<div style='overflow: hidden; margin-left:auto; margin-right:auto; margin-top:15px; padding-bottom:10px; border-bottom: 5px solid #CCC; width:800px; float:none; text-align:center;'>" +
//             "<font style='font-size:40px;  font-weight:bold; color:#00494e'>SICOOB</font><font style='font-size:40px;  font-weight:bold; color:#00b0a0'>CREDIVALE</font><br /><br />" +
//             " <font style='font-size:20px;  font-weight:bold; '>" + cabecalho + "</font><br /><br />" +
//             "<font style='font-size:15px; font-weight:bold; float:left;'>Por: </font>" + user.usu_nome + " - " + user.usu_login + "(" + user.set_descricao + ")<br /> " +
//             "<font style='font-size:15px; font-weight:bold; float:left;'>Em: </font>" + String.Format("{0:dd/MM/yyyy HH:mm}", DateTime.Now) +
//         "</div><br /><br />" +
//         "<div style='overflow: hidden; padding: 17px; margin-left:auto; margin-right:auto;margin-bottom:10px; width:800px;float:none; text-align:LEFT;'>" +
//             "<font style='font-size:15px; font-weight:bold'>Documento: </font>" + doc.doc_desc + doc.doc_extensao + "<br />" +
//             "<font style='font-size:15px; font-weight:bold'>Origem: </font>" + doc.tipos_documentos.origem_documentos.ori_descricao + "<br />" +
//             "<font style='font-size:15px; font-weight:bold'>Tipo: </font>" + doc.tipos_documentos.tip_descricao + "<br />" +
//             "<a target='_blank' href='http://www.credivale.org.br/Intranet_/Documentos/Arquivos?arq=" + doc.doc_codigo.ToString() + "'><span>Clique aqui para visualizar ou baixar o arquivo</span> </a><br /> </div>" +
//         "<div style='overflow: hidden; margin-left:auto; margin-right:auto; margin-top:15px; padding-bottom:10px; padding-top:10px; border-top: 5px solid #CCC; width:800px; float:none; text-align:center;'>" +
//          "<font style='font-size:20px;  font-weight:bold; '> Observações importantes</font><br /></div>" +
//         "<div style='margin-left:auto; margin-right:auto; margin-top:15px; padding:10px;  border: 2px solid #CCC; width:800px; float:none; text-align:left;'>" +
//          doc.doc_observacao +
//         "</div></td></tr></table></body></html>";


                objNovoEmail.BodyEncoding = System.Text.Encoding.UTF8;
                objNovoEmail.Body = cCorpoEmail;
                objSmtp.Host = "smtp.credivale.org.br";
                objSmtp.Port = 587;

                //'Caso queira definir um tempo do timeout
                //'objSmtp.Timeout = 10
                // 'Define se deve usar autenticação ou não

                objSmtp.Credentials = new System.Net.NetworkCredential(user.usu_email + "@credivale.org.br", user.usu_senhaemail);

                //'Habilitar SSL ou não?
                //'Enviando a mensagem por e-mail

                objSmtp.Send(objNovoEmail);
                objNovoEmail.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception("email" + ex.Message);
            }
        }

        public List<VW_documentos> Listar(DateTime? dt1, DateTime? dt2, string tipo, string origem, VW_usuarios user, string desc, int tip)

        {
            try
            {
                return _documentosRepository.Listar(dt1, dt2, tipo, origem, user,desc,tip);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<tipos_documentos> busca_tipos(int origem)
        {
            try
            {
                return _documentosRepository.busca_tipos(origem);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<origem_documentos> busca_origens(int tipo)
        {
            try
            {
                return _documentosRepository.busca_origens(tipo);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string Gettipos(int tipo)
        {
            return _documentosRepository.Gettipos(tipo);
        }

        public List<VW_setor> busca_setores()
        {
            return _documentosRepository.busca_setores();
        }

        public void Inserir(documento documento)
        {
            try
            {
                VW_usuarios user = _usuarioservice.GetUsuarioLogado(0);
                _documentosRepository.Inserir(documento, user);
                documento.tipos_documentos = _documentosRepository.busca_tipo(documento.doc_tipo) ;
                enviar_email(documento, user, documento.doc_desc.ToUpper() + " (DOCUMENTO INSERIDO)",1,null);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Editar(documento documento)
        {
            try
            {
                VW_usuarios user = _usuarioservice.GetUsuarioLogado(0);

              
               _documentosRepository.Editar(documento, _usuarioservice.GetUsuarioLogado(0));
                documento.tipos_documentos = _documentosRepository.busca_tipo(documento.doc_tipo);

                if (documento.enviar_email == true)
                { 
              
                enviar_email(documento, user, documento.doc_desc.ToUpper() + " (DOCUMENTO ALTERADO).",2,null);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void deletar(int codigo)
        {
            try
            {
                _documentosRepository.deletar(codigo, _usuarioservice.GetUsuarioLogado(0));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public documento carrega_busca(long codigo)
        {
            try
            {
                return _documentosRepository.carrega_busca(codigo);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public tipos_origem_documentos busca_tipo_origens(int tip_codigo)
        {
            try
            {
                return _documentosRepository.busca_tipo_origens(tip_codigo);
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        public void liberar_revogar(documento documento)
        {
            try
            {
     
                VW_usuarios user = _usuarioservice.GetUsuarioLogado(0);
               enviar_email(_documentosRepository.carrega_busca(documento.doc_codigo),user, documento.doc_desc.ToUpper() + " (DOCUMENTO INSERIDO).",1,_documentosRepository.liberar_revogar(documento,user));
            }
            catch (Exception ex)
            {

                throw ex;
            }


        }

        public void copiar_perfil(int user_ori, int user_dest)
        {
            try
            {

                _documentosRepository.copiar_perfil(user_ori, user_dest, _usuarioservice.GetUsuarioLogado(0));
            }
            catch (Exception ex)
            {

                throw ex;
            }



        }

    }
}